package smallfrench.moteur.parser;

import java.util.ArrayList;

import smallfrench.moteur.lexer.Position;
import smallfrench.moteur.lexer.lexemes.Lexeme;

/**
 * Lecteur d’une suite de lexèmes.
 * @author antoine1023
 *
 */
public class LecteurLexemes {

	private final Lexeme[] lexemes;

	/**
	 * L’index du prochain lexème à lire.
	 */
	private int position;

	public LecteurLexemes(ArrayList<Lexeme> at) {
		lexemes = at.toArray(new Lexeme[at.size()]);

		position = 0;
	}

	/**
	 * @return Vrai si fin de fichier : plus de lexèmes disponibles.
	 */
	public boolean estFini() {
		return position == lexemes.length;
	}

	/**
	 * @return <code>null</code> si aucun lexème à lire ; sinon la position du
	 * début du lexème suivant, ou la position de la fin du lexème précédent
	 * si pas de lexème suivant.
	 */
	public Position getPosition() {
		if (estFini()) {
			if (lexemes.length != 0)
				return lexemes[lexemes.length - 1].fin;
			else
				return null;
		}
		Position l = suivant().debut;
		precedent();
		return l;
	}

	/**
	 * Avance d’un lexème.
	 * 
	 * @return Le lexème suivant.
	 * @throws IndexOutOfBoundsException Si tous les lexèmes ont été lus.
	 */
	public Lexeme suivant() {
		return lexemes[position++];
	}

	/**
	 * Recule d’un lexème.
	 * 
	 * @throws IndexOutOfBoundsException Si on est déjà au début du fichier.
	 */
	public void precedent() {
		position--;
		if (position < 0) {
			throw new IndexOutOfBoundsException("Lecteur déjà au début du " +
					"fichier.");
		}
	}
}
